WICS 80B Super COMPILER ――――――――――――――――――――――――――――――――――――――― I/O 1982年 6月号掲載 MZ−80B マシン語  0D000H−0EFFFH S:0D000H 起動方法 WICS 80Bを起動 MON L ――――――――――――――――――――――――――――――――――――――― 今回はWICS80Bのコンパイラを発表します。 気の早い方はすでに80K/C用のコンパイラを 80Bに移植して使っているかもしれませんが、 今回発表するバージョンはさらに最適化をすすめているものです。 ・=================・ ll      入力方法       ll ・=================・ オブジェクトのダンプ・リストをTS−1000モニタから 打ち込んでください。 ソース・リストをインタープリタで打ち込んでも コンパイルできないので注意してください(インタープリタでは動きません)。 コンパイラの機能強化などを行なう場合はコンパイラにより ソース・リストを再コンパイルすることになります。 ・=================・ ll 強化された           ll ll 最適化機構について       ll ・=================・ (1) 256以下の定数を乗じる場合。   すべてADD命令で展開されます。 例1.A=A*10 LD HL,(VAR.A)     LD E,L     LD D,H     ADD HL,HL     ADD HL,HL     ADD HL,DE     ADD HL,HL     LD (VAR.A),HL 例2.A=A*256 LD HL,(VAR.A)     LD H,L     LD L,0     LD (VAR.A),HL ただし、定数は演算子“*”の右側に書いてください。 なお、 256以上の定数を乗じる場合は ランタイム・サブルーチンをコールするように展開されます。 (2)2^2で表わされる定数で割る場合。   n個分の算術右シフト命令に置き替えます。   ただし、n≦8の場合はさらに技巧を凝らしています。 例3.A=A/8 LD HL,(VAR.A)     SRA H     RL L     SRA H     RL L     SRA H     RL L     LD (VAR.A),HL 例4.A=A/512 LD HL,(VAR.IA)     LD A,H \     LD L,H |     ADD A,A |÷256の処理     SBC A,A |     LD H,A /     SRA H \     RR L |÷2の処理     LD (VAR.A),HL/   ÷256の処理は符号を保存する必要から、多少長くなってしまいます。 (3)2^nで表わされる定数のMODをとる場合 例5. A=MOD(A,16) LD HL,(VAR.A)     LD DE,15     CALL @AND     LD (VAR.A),HL   2^n−1とのANDをとるだけで済ませています。 ・=================・ ll マシン語データの        ll ll 記述方法について        ll ・=================・ BASEと同じ表現方法で行ないます。すなわち、 ・―――――――――――――――――・ |!(マシン語データ)       | ・―――――――――――――――――・ <マシン語データ>  ■任意個の16進数($マークはつけない)  ■L.で始まる行番号(DEFWと同じ機能)  ■V.で始まる変数Z(DEFWと同じ機能)  ■”(クォーテーション)でつくられた任意個の文字列(DEFMと同じ機能) 例6.あるマシン語サブルーチンをコールしたのち、    Aレジスタの内容をAccという変数に代入する。 ・―――――――――――――――――・ |10 CALL SUBR | |20 !(6F 26 00 22 V.ACC) | ・―――――――――――――――――・ 例7.あるマシン語ルーチンをコールしたのち、    キャリーフラグが立っていれば“ERR”の表示を出す。 ・―――――――――――――――――・ | 10 CALL SUBR | | 20 !(D2 L.40) | | 30 PRINT "ERR"/ | | 40 END | ・―――――――――――――――――・ 例8.テーブルによるデータ交換    (ここでは0〜15までの数字を ASCIIコードに変換している)。 ・――――――――――――――――――――――・ | 10 !(21 L.1000 22 V.TABLE) | | 20 ASCII=TABLE[DATA] | | 30 RETURN | | 1000 !("0 1 2 3 4 5 6 7 8 9 A B C D E F") | ・――――――――――――――――――――――・ 以上のように、このコンパイラでは ソース・リスト中に自由にマシン語やデータをばらまくことができます。 また、ループの内側など、最も実行回数の多い行をマシン語化することにより、 完全にアセンブラと同等の速度を得ることもできます。 ただし、インタープリタ・モードでは動かないので注意してください。 ・=================・ ll   サンプル・プログラム    ll ・=================・ 1万桁の円周率を求めるプログラムを示します(リスト3)。 1,000桁ならは1分足らず、1万桁でも2時間で求まります。 ・=================・ ll      終わりに       ll ・=================・ このコンパイラには、BASEと同じようなOFFSET機能や ROM化のための変数エリア設定(RAMAD)など、 誌面の都合により説明できなかった多くの機能を含んでいますが、 これらの機能を使いこなすことのできる読者ならば ソース・リストをごらんになっていただければわかってもらえると思い、 ごちゃごちやと説明するよりもソース・リストを載せました。 このコンパイラの最適化でまだ不足と思った方はさらに最適化を試みてください。